{
  // 函数声明
  function sum(x: number, y: number): number {
    return x + y;
  }

  // 输入多余的（或者少于要求的）参数，是不被允许的：
  sum(1, 1);

  // 函数表达式
  let mySum = function (x: number, y: number): number {
    return x + y;
  };

  // 在 TypeScript 的类型定义中，=> 用来表示函数的定义，左边是输入类型，需要用括号括起来，右边是输出类型。
  // let mySum: (x: number, y: number) => number = function (
  //   x: number,
  //   y: number
  // ): number {
  //   return x + y;
  // };

  // 可选参数
  // 可选参数必须接在必需参数后面。换句话说，可选参数后面不允许再出现必需参数了
  // function buildName(firstName: string, lastName?: string) {
  //   if (lastName) {
  //     return firstName + " " + lastName;
  //   } else {
  //     return firstName;
  //   }
  // }
  // let tomcat = buildName("Tom", "Cat");
  // let tom = buildName("Tom");

  // 参数默认值
  // 在 ES6 中，我们允许给函数的参数添加默认值，TypeScript 会将添加了默认值的参数识别为可选参数：

  function buildName(firstName: string, lastName: string = "Cat"): string {
    return firstName + " " + lastName;
  }
  let tomcat = buildName("Tom", "Cat");
  let tom = buildName("Tom");

  // 剩余参数 （rest 参数）
  function push(array: any[], ...items: any[]) {
    items.forEach(function (item) {
      array.push(item);
    });
  }

  let a: any[] = [];
  push(a, 1, 2, 3);
}
